Android Kernel Build
整个kernel的编译过程还是踩了许多坑的,前一周搞得,再不写估计就忘了怎么编译的了
环境说明
因为其实没找到对应的taimen PIXEL2XL的linux kernel版本,然后第一次刷把手机刷坏了(只能卡在fastboot界面了),然后所有的fastboot的命令全部失败
问了原来买手机的老板,说
8.0的我也是 用win7系统的电脑才能刷 搞不懂原因
所以抽时间把手机发给老板重刷吧,我觉得一开始应该是好的,只是后来我kernel版本刷崩了
具体环境,linuxkernel我用的是ubuntu20,AOSP还是沿用r0env,直接按照原先编译AOSP的方法编译即可
AOSP自带有编译好的kernel image,再整个AOSP编译完成之后会被打包到boot.img中,所以我们把自编译的内核能重打包替换到boot.img里面就可以刷入我们的内核
下载源码
Android : 修改内核源码 and 编译、打包成新的boot.img - sheldon_blogs - 博客园 (cnblogs.com)
先下载kernel的源码,现在Google提供了分支的下载了
1 | git clone https://android.googlesource.com/kernel/msm.git |
几个分支,我们主流用Google系的产品,就下载msm就行了
1 | goldfish 项目包含适用于所模拟的平台的内核源代码。 |
msm下面还有很多具体型号的分支
grep一下bullhead的分支
我们编译的AOSP是8.0的oreo,所以切换到这个版本
remotes/origin/android-msm-bullhead-3.10-oreo-m2
编译源码
先切换到bullhead上面
git checkout remotes/origin/android-msm-bullhead-3.10-oreo-m2
编译之前也得先clone一下aarch64的gcc
1 | git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/ |
这个clone下来之后也包含大量的分支,我们配套的是oreo Android8.0,因此就将其切换到8.0的分支
1 | origin/oreo-m2-release |
编译的时候出现forbidden的错
(38条消息) android编译error, forbidden warning出错问题解决_loongembedded的博客-CSDN博客
1 | 3.gcc-wrapper.py中注释掉interpret_warning(line)即可 |
Android 驱动开发—Android Linux 内核编译 Nexus 5x (daimajiaoliu.com)
1 | export PATH=$PATH:/mnt/android/android-e-7.1.1-r31/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin:$PATH |
声明几个环境变量之后,直接make就行,make -j4这种多核编译好像有莫名其妙的错误
如果想自己修改内核选项,就先运行完make bullhead_defconfig,执行make menuconfig,修改.config文件
最后编译完成的kernel image在这个下面
重打包Kernel
两种方式
一种是替换AOSP编译时的kernel文件,这样编译完ASOP自动就打包到boot.img里面了
bullhead的就在这个目录下面
第二种方式是直接对boot.img进行操作
用到的工具是AIK
Kernel Hack实战:修改并编译手机内核源码对抗反调试 - FreeBuf网络安全行业门户
osm0sis/Android-Image-Kitchen at AIK-Linux (github.com)
直接把boot.img放到同级目录下,然后执行unpackimg.sh
我们的目标就是替换这个boot.img-kernel,之后再调用repackimg.sh,就可以重打包成新的image-new.image
之后为了防止损坏原有的系统,可以采用临时刷入boot的方法,
总结
内核编译虽然有成熟的工具链,但是相对来讲还是比较复杂,在我自己编译的实践的过程中也是会遇到各种各样的错误,只能说按照上面的步骤,确实是编译成功了,如果突然遇到什么问题,可以重置一下环境,
在编译的过程中,最关键的还是gcc和kernel的版本要对